#include "klasy.h"


using namespace std;

OdczytZapis::OdczytZapis(string i, string o):nazwaPlikuWej(i), nazwaPlikuWyj(o) {} // konstruktor

ListaZwierzat* OdczytZapis::wczytajDaneZPliku(){
    fstream plik;
    string linia;

	plik.open(this->nazwaPlikuWej.c_str(), ios::in); //ma byc to this tu ? tak

		if (plik.good() == false)
	{
		cout << "Plik nie istnieje !" << endl;
	}
	else
    {
        ListaZwierzat *lista = new ListaZwierzat();

        while (getline(plik, linia))
        {
          Zwierze*zwierze = Zwierze::utworz(linia);

        lista->dodajNaKoniec(zwierze);


        }
        lista->wypiszListe();
        return lista;
    }

	plik.close();
}
//moje
ListaZwierzat* OdczytZapis::zapiszDaneDoPliku(ListaZwierzat *lista){

    fstream plik;
    string linia;

	plik.open(this->nazwaPlikuWyj.c_str(), ios::out);

		plik<<"slupieee powiedz mi jak mam zyyyyc"<<endl;


		if (lista -> getPoczatek() == NULL) {
			cout<<"Pusta lista"<<endl;
		} else {
			ElListy *wsk = lista -> getPoczatek();
			while (wsk != NULL) {
				plik<<wsk -> zwierze ->opisZPliku<<endl;
				wsk = wsk -> nast;
			}
		}


	plik.close();
}


    ElListy *ListaZwierzat::getPoczatek() {
        return this -> poczatek;
    }


Zwierze::Zwierze(string &linia):opisZPliku(linia){

    if (linia.find(" ") == string::npos) {
       cout<<"Nieprawidlowy chromosom"<<endl;
    }
    else {

    size_t indeksSpacji = linia.find_first_of(" ");
    int i=0;
    while  (indeksSpacji != string::npos) {
        int tmp_indeksSpacji = indeksSpacji;
        indeksSpacji = linia.find_first_of(" ", indeksSpacji+1);
        string pojedynczy = linia.substr (tmp_indeksSpacji, indeksSpacji - tmp_indeksSpacji - 1);

        chromosom[i] = atoi(pojedynczy.c_str());
        i++;
    }

    }
}
Zwierze::~Zwierze() {}

Zwierze* Zwierze::utworz(string linia){
    string rodzajZwierza = Zwierze::znajdzGatunek(linia);

    if (rodzajZwierza=="Kon") {
        return new Kon(linia);
    }
    else if (rodzajZwierza=="Osiol") {
        return new Osiol(linia);
    }
    else if (rodzajZwierza=="Zajac") {
        return new Zajac(linia);
    }
return NULL;
}
string Zwierze::znajdzGatunek(string linia) {
    size_t indeksSpacji = linia.find_first_of(" ");
    string gatunek = linia.substr (0,indeksSpacji);
    return gatunek;
}

ElListy::ElListy(Zwierze *z) { // konstruktor
		zwierze = z;
		nast = NULL;
	}
ElListy::~ElListy() {}

ListaZwierzat::ListaZwierzat() { // konstruktor
		this->poczatek = NULL;
	}



void ListaZwierzat::dodajNaKoniec(Zwierze *z) {
    ElListy *nowy = new ElListy(z);

    ElListy *tmp_wsk = this -> poczatek;

		if (tmp_wsk == NULL) {
			poczatek = nowy;
		} else {
			while (tmp_wsk->nast != NULL) {
				tmp_wsk = tmp_wsk->nast;
			}
			tmp_wsk -> nast = nowy;
		}
	}




	void ListaZwierzat::wypiszListe() {
		if (this -> poczatek == NULL) {
			cout<<"Pusta lista"<<endl;
		} else {
			ElListy *wsk = this -> poczatek;
			while (wsk != NULL) {
				cout<<wsk -> zwierze ->opisZPliku<<endl;
				wsk = wsk -> nast;
			}
		}

	}

Zajac::Zajac(string linia):Zwierze(linia) {
    cout << "Jestem zajac z linii: " << linia << endl;
}
Kon::Kon(string linia):ZwierzeKopytne(linia) {
    cout << "Jestem kon z linii: " << linia << endl;
}
Osiol::Osiol(string &linia):ZwierzeKopytne(linia) {
    cout << "Jestem osiol z linii: " << linia << endl;
}
ZwierzeKopytne::ZwierzeKopytne(string &linia):Zwierze(linia) {
    cout << "Jestem zwierze kopytne z linii: " << linia << endl;
}
